/**
在 Node.js 中，HTTP 响应对象是通过  http  模块创建的 HTTP 服务器时传递给回调函数的另一个参数。响应对象（ res ）用于构建和发送 HTTP 响应给客户端。
  1. 响应对象概述
  响应对象包含了用于设置 HTTP 响应的各种方法和属性。通过响应对象，开发者可以设置响应状态码、响应头，并发送响应体内容。
  2. 常用属性和方法
   2.1  res.statusCode 
  - **描述**: 设置 HTTP 响应的状态码。例如，200 表示成功，404 表示未找到，500 表示服务器错误。
  - 示例:
  const http = require('http');

  const server = http.createServer((req, res) => {
      res.statusCode = 200; // 设置状态码为 200
      res.end('Hello, World!'); // 发送响应体
  });

  server.listen(3000);
   2.2  res.setHeader(name, value) 
  - 描述: 设置响应头信息。可以通过这个方法设置多个响应头。
  - 示例:
  const http = require('http');

  const server = http.createServer((req, res) => {
      res.statusCode = 200;
      res.setHeader('Content-Type', 'text/plain'); // 设置内容类型为纯文本
      res.end('Hello, World!');
  });

  server.listen(3000);
   2.3  res.getHeader(name) 
  - 描述: 获取指定名称的响应头信息。
  - 示例:
  const http = require('http');

  const server = http.createServer((req, res) => {
      res.statusCode = 200;
      res.setHeader('Content-Type', 'text/plain');
      console.log('Content-Type:', res.getHeader('Content-Type')); // 获取并打印 Content-Type
      res.end('Hello, World!');
  });

  server.listen(3000);
   2.4  res.write(chunk[, encoding][, callback]) 
  - 描述: 向响应体中写入数据。可以多次调用  write()  方法来发送多个数据块。
  - 示例:
  const http = require('http');

  const server = http.createServer((req, res) => {
      res.statusCode = 200;
      res.setHeader('Content-Type', 'text/plain');
      
      res.write('Hello, '); // 写入第一个数据块
      res.write('World!');   // 写入第二个数据块
      res.end();             // 结束响应
  });

  server.listen(3000);
   2.5  res.end([data[, encoding]]) 
  - 描述: 结束响应并发送数据。如果传递了数据，它将作为响应体发送。
  - 示例:
  const http = require('http');

  const server = http.createServer((req, res) => {
      res.statusCode = 200;
      res.setHeader('Content-Type', 'text/plain');
      res.end('Hello, World!'); // 结束响应并发送数据
  });

  server.listen(3000);
  3. 发送 JSON 响应
  通常在 API 开发中，可能需要发送 JSON 格式的响应。可以设置  Content-Type  为  application/json ，并使用  JSON.stringify()  方法将对象转换为 JSON 字符串。

   示例：
  const http = require('http');

  const server = http.createServer((req, res) => {
      res.statusCode = 200;
      res.setHeader('Content-Type', 'application/json');
      const responseData = { message: 'Hello, World!' };
      res.end(JSON.stringify(responseData)); // 发送 JSON 响应
  });

  server.listen(3000);
  4. 总结
  Node.js 的 HTTP 响应对象提供了丰富的功能，允许开发者灵活地设置响应状态码、响应头和响应体。通过响应对象，开发者可以构建和发送各种类型的 HTTP 响应，满足不同的客户端请求需求。掌握响应对象的使用对于开发高效的 Node.js 应用程序至关重要。
 */
const http = require("http");

const server = http.createServer((request, response) => {
  /**
   * response对象 => Writable可写流
   *  1. 设置响应状态码: statusCode
   *  2. 设置响应头: setHeader
   *  3. 发送响应数据: end
   *  4. 发送 JSON 响应: JSON.stringify
   *  5. 重定向: statusCode 和 setHeader
   *  6. 响应文件: fs.createReadStream
   *  7. 响应压缩: zlib.createGzip
   *  8. 响应缓存: setHeader
   *  9. 响应代理: http-proxy
   *  10. 响应日志: morgan
   *  11. 响应错误处理: try-catch
   */
  // 1. 设置响应状态码
  // 1.1 statusCode
  // response.statusCode = 200;

  // 1.2 writeHead 响应头
  // response.writeHead(401);

  // 2. 设置响应头
  // 2.1 setHeader
  // response.setHeader("Content-Type", "text/html; charset=utf-8");

  // 2.和http status code一起设置
  response.writeHead(200, {
    "Content-Type": "application/json; charset=utf8;",
  });

  response.write("hello response write stream");
  response.end("hello response end stream");
});

server.listen(8080, () => {
  console.log("server is running at http://localhost:8080");
});
